home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Atari Mega Archive 2
/
Atari Mega Archive CD - Volume 2.iso
/
minix
/
up1510b.tgz
/
up1510b
/
src
/
commands
/
nroff
/
escape.c
< prev
next >
Wrap
C/C++ Source or Header
|
1990-07-23
|
17KB
|
1,062 lines
/*
* escape.c - Escape and special character input processing portion of
* nroff word processor
*
* adapted for atariST/TOS by Bill Rosenkranz 11/89
* net: rosenkra@hall.cray.com
* CIS: 71460,17
* GENIE: W.ROSENKRANZ
*
* original author:
*
* Stephen L. Browning
* 5723 North Parker Avenue
* Indianapolis, Indiana 46220
*
* history:
*
* - Originally written in BDS C;
* - Adapted for standard C by W. N. Paul
* - Heavily hacked up to conform to "real" nroff by Bill Rosenkranz
*/
#undef NRO_MAIN /* extern globals */
#include <stdio.h>
#include "nroff.h"
/*------------------------------*/
/* expesc */
/*------------------------------*/
expesc (p, q)
char *p;
char *q;
{
/*
* Expand escape sequences
*/
register char *s;
register char *t;
register char *pstr;
register int i;
register int val;
register int autoinc;
char c;
char fs[5]; /* for font change */
char nrstr[20];
char fmt[20];
char name[10];
int nreg;
char *pfs;
int inc;
int tmp;
char delim;
s = p;
t = q;
/*
* if escape parsing is not on, just copy string
*/
if (dc.escon == NO)
{
while (*s != EOS)
{
*t++ = *s++;
}
*t = EOS;
strcpy (p, q);
return;
}
/*
* do it...
*/
while (*s != EOS)
{
if (*s != dc.escchr)
{
/*
* not esc, continue...
*/
*t++ = *s++;
}
else if (*(s + 1) == dc.escchr)
{
/*
* \\ escape escape
*/
*t++ = *s++;
++s;
}
else if (*(s + 1) == 'n')
{
/*
* \nx, \n(xx register
*
* first check for \n+... or \n-... (either form)
*/
s += 2;
autoinc = 0;
if (*s == '+')
{
autoinc = 1;
s += 1;
}
if (*s == '-')
{
autoinc = -1;
s += 1;
}
/*
* was this \nx or \n(xx form?
*/
if (isalpha (*s))
{
/*
* \nx form. find reg (a-z)
*/
nreg = tolower (*s) - 'a';
/*
* was this \n+x or \n-x? if so, do the
* auto incr
*/
if (autoinc > 0)
dc.nr[nreg] += dc.nrauto[nreg];
else if (autoinc < 0)
dc.nr[nreg] -= dc.nrauto[nreg];
/*
* display format
*/
if (dc.nrfmt[nreg] == '1')
{
/*
* normal decimal digits
*/
t += itoda (dc.nr[nreg], t, 6) - 1;
}
else if (dc.nrfmt[nreg] == 'i')
{
/*
* lower roman
*/
t += itoroman (dc.nr[nreg], t, 24) - 1;
}
else if (dc.nrfmt[nreg] == 'I')
{
/*
* upper roman
*/
t += itoROMAN (dc.nr[nreg], t, 24) - 1;
}
else if (dc.nrfmt[nreg] == 'a')
{
/*
* lower letters
*/
t += itoletter (dc.nr[nreg], t, 12) - 1;
}
else if (dc.nrfmt[nreg] == 'A')
{
/*
* upper letters
*/
t += itoLETTER (dc.nr[nreg], t, 12) - 1;
}
else if (dc.nrfmt[nreg] & 0x80)
{
/*
* zero-filled decimal
*/
sprintf (fmt, "%%0%dld",
(int)(dc.nrfmt[nreg] & 0x7F));
fmt[5] = '\0';
sprintf (nrstr, fmt, (long) dc.nr[nreg]);
tmp = dc.nrfmt[nreg] & 0x7F;
nrstr[tmp] = '\0';
strcpy (t, nrstr);
t += strlen (nrstr);
}
else
{
/*
* normal (default)
*/
t += itoda (dc.nr[nreg], t, 6) - 1;
}
++s;
}
else if (*s == '%')
{
/*
* \n% form. find index into reg struct
*/
nreg = findreg ("%");
if (nreg < 0)
{
fprintf (err_stream,
"***%s: no register match\n",
myname);
err_exit (-1);
}
/*
* was this \n+% or \n-%? if so, do the
* auto incr
*/
if (autoinc > 0)
rg[nreg].rval += rg[nreg].rauto;
else if (autoinc < 0)
rg[nreg].rval -= rg[nreg].rauto;
/*
* display format
*/
if (rg[nreg].rfmt == '1')
{
/*
* normal decimal digits
*/
t += itoda (rg[nreg].rval, t, 6) - 1;
}
else if (rg[nreg].rfmt == 'i')
{
/*
* lower roman
*/
t += itoroman (rg[nreg].rval, t, 24) - 1;
}
else if (rg[nreg].rfmt == 'I')
{
/*
* upper roman
*/
t += itoROMAN (rg[nreg].rval, t, 24) - 1;
}
else if (rg[nreg].rfmt == 'a')
{
/*
* lower letters
*/
t += itoletter (rg[nreg].rval, t, 12) - 1;
}
else if (rg[nreg].rfmt == 'A')
{
/*
* upper letters
*/
t += itoLETTER (rg[nreg].rval, t, 12) - 1;
}
else if (rg[nreg].rfmt & 0x80)
{
/*
* zero-filled decimal
*/
sprintf (fmt, "%%0%dld",
(int)(rg[nreg].rfmt & 0x7F));
fmt[5] = '\0';
sprintf (nrstr, fmt, (long) rg[nreg].rval);
tmp = rg[nreg].rfmt & 0x7F;
nrstr[tmp] = '\0';
strcpy (t, nrstr);
t += strlen (nrstr);
}
else
{
/*
* normal (default)
*/
t += itoda (rg[nreg].rval, t, 6) - 1;
}
s += 1;
}
else if (*s == '(')
{
/*
* \n(xx form. find index into reg struct
*/
s += 1;
name[0] = *s;
name[1] = *(s + 1);
if (name[1] == ' ' || name[1] == '\t'
|| name[1] == '\n' || name[1] == '\r')
name[1] = '\0';
name[2] = '\0';
nreg = findreg (name);
if (nreg < 0)
{
fprintf (err_stream,
"***%s: no register match\n",
myname);
err_exit (-1);
}
/*
* was this \n+(xx or \n-(xx? if so, do the
* auto incr
*/
if (rg[nreg].rflag & RF_WRITE)
{
if (autoinc > 0)
rg[nreg].rval += rg[nreg].rauto;
else if (autoinc < 0)
rg[nreg].rval -= rg[nreg].rauto;
}
/*
* display format
*/
if (rg[nreg].rfmt == '1')
{
/*
* normal decimal digits
*/
t += itoda (rg[nreg].rval, t, 6) - 1;
}
else if (rg[nreg].rfmt == 'i')
{
/*
* lower roman
*/
t += itoroman (rg[nreg].rval, t, 24) - 1;
}
else if (rg[nreg].rfmt == 'I')
{
/*
* upper roman
*/
t += itoROMAN (rg[nreg].rval, t, 24) - 1;
}
else if (rg[nreg].rfmt == 'a')
{
/*
* lower letters
*/
t += itoletter (rg[nreg].rval, t, 12) - 1;
}
else if (rg[nreg].rfmt == 'A')
{
/*
* upper letters
*/
t += itoLETTER (rg[nreg].rval, t, 12) - 1;
}
else if (rg[nreg].rfmt & 0x80)
{
/*
* zero-filled decimal
*/
sprintf (fmt, "%%0%dld",
(int)(rg[nreg].rfmt & 0x7F));
fmt[5] = '\0';
sprintf (nrstr, fmt, (long) rg[nreg].rval);
tmp = rg[nreg].rfmt & 0x7F;
nrstr[tmp] = '\0';
strcpy (t, nrstr);
t += strlen (nrstr);
}
else
{
/*
* normal (default)
*/
t += itoda (rg[nreg].rval, t, 6) - 1;
}
s += 2;
}
}
else if (*(s + 1) == '\"')
{
/*
* \" comment
*/
*s = EOS;
*t = *s;
return;
}
else if (*(s + 1) == '*')
{
/*
* \*x, \*(xx string
*/
s += 2;
if (*s == '(')
{
/*
* \*(xx form
*/
s += 1;
name[0] = *s;
name[1] = *(s + 1);
name[2] = '\0';
pstr = getstr (name);
if (!pstr)
{
fprintf (err_stream,
"***%s: string not found\n",
myname);
err_exit (-1);
}
while (*pstr)
*t++ = *pstr++;
s += 2;
}
else
{
/*
* \*x form
*/
name[0] = *s;
name[1] = '\0';
pstr = getstr (name);
if (!pstr)
{
fprintf (err_stream,
"***%s: string not found\n",
myname);
err_exit (-1);
}
while (*pstr)
*t++ = *pstr++;
s += 1;
}
}
else if (*(s + 1) == 'f')
{
/*
* \fx font
*/
s += 2;
pfs = fs; /* set up ret string */
fs[0] = '\0';
/*
* it parses 1-2 char of s and returns esc seq for
* \fB and \fR (\fI is same as \fB)
*/
fontchange (*s, pfs);
/*
* imbed the atari (vt52) escape seq
*/
while (*pfs)
*t++ = *pfs++;
++s; /* skip B,I,R,S,P */
}
else if (*(s + 1) == '(')
{
/*
* \(xx special char
*/
s += 2;
/*
* it returns num char to skip and sets c to
* the ascii value of the char
*/
inc = specia